
// Copyright (c) 2023 刻BITTER
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.


#pragma once


namespace oled_basic {

    /**
     * @brief 存储字体的元信息，方便使用
     *
     * 字体数组中，单个符号从左到右，按列切分成多个字节，对于宽度6，高度8 的符号，在数组中切分成6 个字节。
     * 宽度8，高度16 的符号占用两页，数组中，从上到下按页拆分成2 组，显示第一页的8 个字节，然后第二页。
     *
     * 所以，如果想访问数组中的第n 个符号，先减去offset：
     * n -= offset;
     *
     * 然后乘以每个符号占用的字节数：
     * pos = n * width * height;
     * 
     * OLED 库如果想省资源，大头都在字库上，所以采用这种直观的存储方式，字库数组和元信息分开，
     * 不需要折腾编码和二进制格式，方便裁剪字库。
     *
     */
    struct FontMeta {
        const uint8_t* font_data;  // 指向字体数组的指针
        uint8_t width;             // 字体占用的列数
        uint8_t height;            // 字体占用的页数，如果字体是6x8，则宽、高分别是6，1
        uint8_t offset;  // 字体数组中第一个元素对应的ascii 码
        // uint8_t glyph_size;  // width * height
    };


    extern const FontMeta ascii_6x8;
    extern const FontMeta ascii_6x8_no_lower_case;

    extern const FontMeta ascii_8x16;
    extern const FontMeta ascii_8x16_no_lower_case;
    extern const FontMeta ascii_8x16_number_only;
    extern const FontMeta ascii_8x16_upper_case_only;

    
    extern const FontMeta big_digit_12x24;

}  // namespace oled_basic
